﻿using QFramework;

namespace Gp.Scripts.Core
{
    
    /// <summary>
    /// 每个业务系统都有各自的持久数据，仅在游戏逻辑中（存档内）可用，在主界面或其他非gameplay界面内数据无效。
    /// 会跟随全局生命周期，加载、保存、清空
    /// </summary>
    public abstract class BaseSystemData : IStructure
    {
        /// <summary>
        /// 保存数据，在游戏保存时调用。
        /// </summary>
        /// <param name="file">存储文件，可以往里写入数据</param>
        public void SaveData(SaveFile file) { OnSave(file); }

        /// <summary>
        /// 载入数据，在游戏载入时调用
        /// </summary>
        /// <param name="file">存储文件，可以往里读出数据。写入操作是无效的。</param>
        public void LoadData(SaveFile file) { OnLoad(file); }

        /// <summary>
        /// 析构，在退出游戏、退出到主界面、切换读档前调用
        /// </summary>
        public void Clear() { OnClear(); }
        
        /// <summary>
        /// 重写保存数据逻辑，在游戏保存时调用。
        /// </summary>
        /// <param name="file">存储文件，可以往里写入数据</param>
        protected abstract void OnSave(SaveFile file);
        
        /// <summary>
        /// 重写载入数据逻辑，在游戏载入时调用。子类重写
        /// </summary>
        /// <param name="file">存储文件，可以往里读出数据。写入操作是无效的。</param>
        protected abstract void OnLoad(SaveFile file);
        
        
        /// <summary>
        /// 重写析构逻辑，在退出游戏、退出到主界面、切换读档前调用。
        /// </summary>
        protected abstract void OnClear();
    }
}